package com.yangzheandroid.rxmvp.http;

import android.util.Log;

import com.yangzheandroid.retrofitutils.utils.NetUtils;
import com.yangzheandroid.rxmvp.APP;
import com.yangzheandroid.rxmvp.utils.ToastUtils;

import java.net.SocketTimeoutException;

import rx.Subscriber;

import static com.yangzheandroid.rxmvp.utils.ToastUtils.showToast;

/**
 * 默认的 Subscriber 封装
 */
public abstract class DefaultSubscriber<T> extends Subscriber<T> {
    private static final String TAG = DefaultSubscriber.class.getSimpleName();

    @Override
    public void onCompleted() {
        unsubscribeMethod();
    }

    @Override
    public void onError(Throwable e) {

        if (e instanceof ApiException) {
            Log.e("ApiException", e.getMessage());
            this.onApiException((ApiException) e);
        } else {
            Log.e(TAG, e.getMessage(), e);
            this.onHttpException(e);
        }

        unsubscribeMethod();
    }

    /**
     * 业务层的 Api 异常封装, 默认不进行处理
     */
    public void onApiException(ApiException e) {
        showToast(e.getMessage());
    }

    /**
     * 系统其他的异常, 默认不进行处理
     */
    public void onHttpException(Throwable e) {
        if (!NetUtils.isNetworkAvailable(APP.getInstance())) {
            ToastUtils.showToast("网络连接不可用!");
            this.onNoNetException(e);
        } else if (e instanceof SocketTimeoutException) {
            ToastUtils.showToast("网络超时!");
        } else {
            ToastUtils.showToast("网络繁忙,请稍候重试");
        }
    }

    /**
     * 没有网络的异常, 默认不进行处理
     */
    public void onNoNetException(Throwable e) {

    }

    private void unsubscribeMethod() {
        if (!isUnsubscribed()) {
            unsubscribe();
        }
    }
}